<template>
	<view class="container">
		<!-- 上传视频按钮 -->
		<button @click="chooseVideo" class="upload-button">选择上传视频</button>

		<!-- 显示上传进度和视频预览 -->
		<view v-if="videoSrc">
			<video :src="videoSrc" controls style="width: 100%;"></video>
			<view class="uploading">
				<text>上传进度：{{ uploadPercentage }}%</text>

				<!-- 自定义上传进度条 -->
				<view class="progress-bar">
					<view class="progress-inner" :style="{ width: uploadPercentage + '%' }"></view>
				</view>

				<!-- 上传速度 -->
				<text v-if="uploadSpeed">{{ uploadSpeed }}</text>

				<!-- 暂停/继续按钮 -->
				<button v-if="uploadPercentage > 0 && uploadPercentage < 100" @click="toggleUpload">
					{{ isPaused ? '继续上传' : '暂停上传' }}
				</button>
			</view>
		</view>

		<!-- 检测进行中的提示 -->
		<view v-if="isWaitingForResult" class="waiting-message">
			<text>检测进行中，请您稍后在历史记录中查看...</text>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				videoSrc: '', // 保存选中视频的路径
				uploadPercentage: 0, // 上传进度
				uploadSpeed: '0 MB/s', // 上传速度，初始为0
				chunkSize: 1024 * 1024 * 5, // 分片大小，5MB
				currentChunk: 0, // 当前上传的分片
				totalChunks: 0, // 总分片数
				isPaused: false, // 是否暂停上传
				uploadFileSize: 0, // 文件大小
				fileMD5: '', // 文件 MD5 值
				startTime: 0, // 开始上传的时间
				isWaitingForResult: false, // 是否在等待抑郁分数返回
				finalResult: null, // 存储模型返回的最终结果
				isend:0,
			};
		},
		mounted() {
		},
		methods: {
			// 选择视频
			chooseVideo() {
				uni.chooseVideo({
					sourceType: ['album'], // 仅允许从相册中选择视频
					success: (res) => {
						console.log('选择的视频: ', res);

						// 设置视频路径
						this.videoSrc = res.tempFilePath;

						// 获取文件详细信息（包括文件大小）并计算 MD5
						wx.getFileInfo({
							filePath: res.tempFilePath,
							digestAlgorithm: 'md5',
							success: (fileInfo) => {
								this.uploadFileSize = fileInfo.size; // 设置文件大小
								this.fileMD5 = fileInfo.digest; // 获取 MD5 值
								console.log("用户的username:",this.$globalData.username);
								console.log("用户的id:",this.$globalData.userID);
								console.log('文件大小size:', this.uploadFileSize)
								console.log('文件 MD5:', this.fileMD5);
								this.prepareUpload(); // 准备分片上传
							},
							fail: (err) => {
								console.error('获取文件信息失败: ', err);
							},
						});
					},
					fail: (err) => {
						console.error('选择视频失败: ', err);
					},
				});
			},

			// 准备分片上传
			prepareUpload() {
				if (!this.uploadFileSize || !this.fileMD5) {
					console.error('上传文件大小或 MD5 未初始化');
					return;
				}

				// 开始分片上传
				this.currentChunk = 0;
				this.totalChunks = Math.ceil(this.uploadFileSize / this.chunkSize);
				this.uploadPercentage = 0;
				this.uploadSpeed = '0 MB/s'; // 上传速度重置为0
				this.isPaused = false;
				this.startTime = Date.now(); // 开始时间
				this.uploadNextChunk(); // 开始上传
			},

			uploadNextChunk() {
				if (this.isPaused || this.currentChunk >= this.totalChunks) return;
			
				const start = this.currentChunk * this.chunkSize;
				const end = Math.min(this.uploadFileSize, start + this.chunkSize);

				wx.getFileSystemManager().readFile({
					filePath: this.videoSrc, // 视频的临时路径
					position: start,
					length: end - start, // 计算当前分片大小
					success: (fileRes) => {
						// 使用 wx.getFileSystemManager().writeFile 将分片写入一个临时文件
						const tempFilePath =
							`${wx.env.USER_DATA_PATH}/chunk_${this.currentChunk}.tmp`; // 定义临时文件路径
						wx.getFileSystemManager().writeFile({
							filePath: tempFilePath,
							data: fileRes.data, // 读取到的文件分片数据
							success: () => {
								const startTime = Date.now();

								// 通过 wx.uploadFile 上传临时保存的分片文件
								wx.uploadFile({
									url: this.$globalData.upload_url, // 替换为你的后端接口
									filePath: tempFilePath, // 上传临时文件路径，即当前文件的分片
									name: 'chunk', // 这个是文件字段名，保持一致
									formData: {
										md5: this.fileMD5, // 文件 MD5 校验
										index: this.currentChunk + 1, // 当前分片的索引
										chunkTotal: this.totalChunks, // 总分片数
										isend:this.isend, // 文件总大小
										fileName: this.videoSrc.split('/').pop(), // 提取文件名
										chunkSize: this.chunkSize, // 每个分片的大小
										userInfo: JSON.stringify({
											userId: this.$globalData.userID,
											username: this.$globalData.username
										}),
										timetamps:JSON.stringify(Array.from([])),
										isupload:1
									},
									success: (res) => {
										const endTime = Date.now();
										const timeDiff = (endTime - startTime) /
											1000; // 上传时间差（秒）
										const uploadedSize = end - start;
										this.uploadSpeed = (uploadedSize / 1024 /
												1024 / timeDiff).toFixed(2) +
											' MB/s'; // 实时计算上传速度
										console.log("返回的结果:", res);
										const responseData = JSON.parse(res.data);
										console.log('解析后的 JSON:', responseData);

										if (responseData.code === 201) {
											// 201状态表示分片上传成功
											console.log(
												`分片 ${this.currentChunk + 1} 上传成功`);
										}

										// 删除临时文件
										wx.getFileSystemManager().unlink({
											filePath: tempFilePath,
											success: () => {
												console.log(
													`临时文件 ${tempFilePath} 已成功删除`
												);
											},
											fail: (err) => {
												console.error(
													`删除临时文件 ${tempFilePath} 失败:`,
													err);
											}
										});

										this.currentChunk++;
										if(this.currentChunk+1 ===this.totalChunks){
											this.isend=1;
										}
										this.uploadPercentage = Math.floor((this
												.currentChunk / this.totalChunks) *
											100);

										if (this.currentChunk < this.totalChunks) {
											this.uploadNextChunk(); // 上传下一个分片
										} else {
											this.uploadSpeed =
												'0 MB/s'; // 上传完成后将上传速度设置为0
											if (responseData.code === 200) {
												console.log('所有分片上传完成，等待最终结果');
												this.showWaitingMessage(); // 显示“检测进行中”的提示
												setTimeout(() => {
												    this.processFinalResult();
												}, 2000); // 2000 毫秒延时，即 2 秒
												uni.navigateTo({
													url: `/pages/homepage/homepage`, // 假设结果页面路径为 /pages/result/result
												});
											}
										}
									},
									fail: (err) => {
										console.error('上传失败: ', err);
										wx.showToast({
											title: '上传失败',
											icon: 'none',
										});
									},
								});
							},
							fail: (err) => {
								console.error('分片写入临时文件失败:', err);
							}
						});
					},
					fail: (err) => {
						console.error('读取文件分片失败:', err);
					},
				});
			},
			// 处理最终结果
			processFinalResult() {
				this.isWaitingForResult = false; // 关闭检测中提示
				this.navigateToResult(); // 跳转至结果页面，传递结果
			},

			// 显示等待提示
			showWaitingMessage() {
				this.isWaitingForResult = true;
			},

			// 跳转到结果页面并传递检测分数
			navigateToResult(depressionScore) {
				uni.navigateTo({
					url: `/pages/homepage/homepage`, // 假设结果页面路径为 /pages/result/result
				});
			},

			// 暂停或继续上传
			toggleUpload() {
				this.isPaused = !this.isPaused;
				if (!this.isPaused) {
					this.uploadNextChunk(); // 继续上传
				}
			},
		},
	};
</script>

<style scoped>
	.container {
		padding: 20px;
		text-align: center;
	}

	.upload-button {
		background-color: #02b6c4;
		color: white;
		padding: 10px 20px;
		border-radius: 5px;
		font-size: 16px;
		border: none;
		margin-bottom: 20px;
	}

	.uploading {
		margin-top: 20px;
	}

	.progress-bar {
		width: 100%;
		height: 20px;
		background-color: #e0e0e0;
		border-radius: 10px;
		overflow: hidden;
		margin-top: 10px;
	}

	.progress-inner {
		height: 100%;
		background-color: #4caf50;
		border-radius: 10px 0 0 10px;
		transition: width 0.4s ease;
	}

	.waiting-message {
		margin-top: 20px;
		font-size: 16px;
		color: #ffa500;
	}
</style>